15. get value from Resource Manage Class

RAII 클래스의 객체가 객체를 감싸고 있는 자원으로 변환하기 위해서,
명시적 변환(explicit conversion) 혹은 암시적 변환(implicit conversion)을 사용한다.

std::shared_ptr, std::auto_ptr은 명시적 변환을 제공하는 get 멤버함수를 제공한다.
std::shared_ptr<Investment> pInv(createInvestment());
int daysHeld(const Investment* pi);
// int days=daysHeld(pInv); // error: shared_ptr<Investment> != Investment*
int days=daysHeld(pInv.get());
스마트 포인터 shared_ptr, auto_ptr 등은 operator->, operator*도 오버로딩되어 있다.
class Investment{
public:
bool isTaxFree() const;
// ...
};
Investment* createInvestment(); // Factory Function
std::shared_ptr<Investment> pi1(createInvestment());
bool taxable1=!(pi1->isTaxFree());
// ...
std::auto_ptr<Investment> pi2(createInvestment());
bool taxable2=!((*pi2).isTaxFree());
// ...
암시적 변환 함수를 제공
FontHandle getFont(void); // C API
void releaseFont(FontHandle fh); // C API
class Font{ // RAII class
public:
explicit Font(FontHandle fh): f(fh) {}
~Font(){ releaseFont(f); }
FontHandle get(void) const { return f; } //
operator FontHandle() const{ //
return f;
}
private:
FontHandle f;
};
위와 같이 암시적 변환 함수( operator FontHandle() )를 정의할 경우,
아래와 같이 사용 가능하다.

하지만 operator FontHandle을 정의하면 의도치 않게 사용될 수 있다.
원하지 않은 타입 변환이 일어날 여지를 줄이기 위해 get 등의 명시적 변환 함수를 제공하는 것이 좋음
void changeFontSize(FontHandle f, int newSize); // C API
Font f(getFont());
int newFontSize;
changeFontSize(f.get(), newFontSize); //
changeFontSize(f, newFontSize); //